#include <reg52.H>

#define U unsigned
#define C char

U C i, m, z, n, h, t = 0,k;

U C code num[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0xbf};
void Delays(U C t); //延时函数

void Show_SMG(U C k, U C l) //数码管显示函数
{
	Delays(1);
	P2 = ~(0x01<<k);
	P1 = num[l];
}

U char x;

void int0_init() //初始化定时器中断器函数
{
	ET0 = 1;
	EA = 1;
	TF0 = 1;
	PT0 = 0;
}

void int1_init() //初始化外部中断函数
{
	IT0 = 0;
	IE0 = 1;
	EX0 = 1;
	EA = 1;
	PT0 = 1;
	PX0 = 0; //设置定时器优先级
}

void int2_init() //初始化外部中断2函数
{
	IT1 = 1;
	IE1 = 1;
	EX1 = 1;
	EA = 1;
	PT1 = 1;
	PX1 = 1; //设置定时器优先级
}

void int0_en2() interrupt 2 //外部中断2,触发调时函数
{
	switch(t)
	{
		case 1:
			m++;
			if (m == 60)
			{
				n++;
				m = 0;
			}
			break;
		case 2 :
			m += 10;
			if (m == 60)
			{
				n++;
				m = 0;
			}
			break;
		case 3:
			n += 1;
			if (n == 60)
			{
				z++;
				n = 0;
			}
			break;
		case 4:
			n += 10;
			if (n == 60)
			{
				z++;
				n = 0;
			}
			break;
		case 5:
			z += 1;
			if (z == 60)
			{
				z = 0;
			}
			break;
		case 6:
			z += 10;
			if (z >= 24)
			{
				z = 0;
			}
			break;
	}
}

void int0_en1() interrupt 0 //外部中断,触发调时函数
{
	Delays(50);   //按键防抖
	for(i=0;i<8;i++)
	{
		Show_SMG(i,10);
	}
	t++;
	ET0 = 0;
	if(t>6){
		TH0 = (65536 - 3000) / 256;
		TL0 = (65536 - 3000) % 256;
		ET0 = 1;
		t=0;
	}
}
void en0() interrupt 1 //定时器中断，触发秒的进位
{
	h++;
	if (h == 120)
	{
		m += 1;
		h = 0;
	}

	TH0 = (65536 - 3000) / 256;
	TL0 = (65536 - 3000) % 256;
	TR0 = 1;
	while (!TF0)
		;
	TF0 = 0;
	if (m == 60)
	{
		n++;
		m = 0;
	}
	if (n == 60)
	{
		z++;
		n = 0;
	}
	if(z>24){
		z=0;
	}
}
void main()
{
	int0_init(); //定时器中断初始化
	int1_init(); //外部中断1初始化
	int2_init(); //外部中断2初始化
	while (1)
	{
		switch(t)
		{
			case 0:
				Show_SMG(0, z / 10);
				Show_SMG(1, z % 10);
				Show_SMG(2, 11);
				Show_SMG(3, n / 10);
				Show_SMG(4, n % 10);
				Show_SMG(5, 11);
				Show_SMG(6, m / 10);
				Show_SMG(7, m % 10);
				break;
			case 1:
				Show_SMG(0, z / 10);
				Show_SMG(1, z % 10);
				Show_SMG(2, 11);
				Show_SMG(3, n / 10);
				Show_SMG(4, n % 10);
				Show_SMG(5, 11);
				Show_SMG(6, m / 10);
				k++;
				if(k%8==0){
					Show_SMG(7, 10);
					Show_SMG(7, 10);
					k=0;
				}else{
					Show_SMG(7, m % 10);
				}
				break;
			case 2:
				Show_SMG(0, z / 10);
				Show_SMG(1, z % 10);
				Show_SMG(2, 11);
				Show_SMG(3, n / 10);
				Show_SMG(4, n % 10);
				Show_SMG(5, 11);
				k++;
				if(k%10==0){
					Show_SMG(6, 10);
					Show_SMG(6, 10);
					k=0;
				}else{
					Show_SMG(6, m / 10);
				}
				Show_SMG(7, m % 10);
				break;
			case 3:
				Show_SMG(0, z / 10);
				Show_SMG(1, z % 10);
				Show_SMG(2, 11);
				Show_SMG(3, n / 10);	
				k++;
				if(k%10==0){
					Show_SMG(4, 10);
					Show_SMG(4, 10);
					k=0;
				}else{
					Show_SMG(4, n % 10);
				}
				Show_SMG(5, 11);
				Show_SMG(6, m / 10);
				Show_SMG(7, m % 10);
				break;
			case 4:
				Show_SMG(0, z / 10);
				Show_SMG(1, z % 10);
				Show_SMG(2, 11);
				k++;
				if(k%10==0){
					Show_SMG(3, 10);
					Show_SMG(3, 10);
					k=0;
				}else{
					Show_SMG(3, n / 10);
				}
				Show_SMG(4, n % 10);
				Show_SMG(5, 11);
				Show_SMG(6, m / 10);
				Show_SMG(7, m % 10);
				break;
			case 5:
				Show_SMG(0, z / 10);
				k++;
				if(k%10==0){
					Show_SMG(1, 10);
					Show_SMG(1, 10);
					k=0;
				}else{
					Show_SMG(1, z % 10);
				}
				
				Show_SMG(2, 11);
				Show_SMG(3, n / 10);
				Show_SMG(4, n % 10);
				Show_SMG(5, 11);
				Show_SMG(6, m / 10);
				Show_SMG(7, m % 10);
				break;
			case 6: 
				k++;
				if(k%10==0)
				{
					Show_SMG(0, 10);
					Show_SMG(0, 10);
					k=0;
				}else{
					Show_SMG(0, z / 10);
				}
				
				Show_SMG(1, z % 10);
				Show_SMG(2, 11);
				Show_SMG(3, n / 10);
				Show_SMG(4, n % 10);
				Show_SMG(5, 11);
				Show_SMG(6, m / 10);
				Show_SMG(7, m % 10);
				break;
		}
	}
}

void Delays(U C t)
{
	unsigned char a, b, i;
	for (i = 0; i < t; i++)
		for (b = 199; b > 0; b--)
			for (a = 1; a > 0; a--)
				;
}